#ifndef MUSICPLAYER_H
#define MUSICPLAYER_H

#include <QWidget>
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QPropertyAnimation>
#include <QSqlDatabase>
#include "volumetool.h"
#include "musiclist.h"
#include "commonpage.h"
#include "lrcpage.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MusicPlayer; }
QT_END_NAMESPACE

class MusicPlayer : public QWidget
{
    Q_OBJECT

public:
    MusicPlayer(QWidget *parent = nullptr);
    ~MusicPlayer();

    // 初始化
    void initUi();
    void initSqlite();
    void initMusicList();
    void initPlayer();

    // 负责所有的关联信号槽
    void connectSignalAndSlots();

    // 随机生成推荐页的内容，通过QJsonArray返回
    // 推荐页的内容应该是根据用户喜好进行推荐的，每次打开可能都不一样
    QJsonArray randomPicture();

    // 关闭程序
    void onMusicPlayerQuit();

private:
    void setVolumeImage(bool isMuted);

private slots:
    void on_quit_clicked();
    void on_volume_clicked();
//    void on_addLocal_clicked();

    void onBtFormClicked(int pageId);
    void addLocalMusic();
    void updateLikeMusicAndPage(bool isLike, iterator it);

    // 播放控制区的槽函数
    // 播放按钮：歌曲在播放和暂停之间切换
    void on_play_clicked();
    // QMediaPlayer中stateChanged信号对应槽函数
    void onPlayerStateChanged(QMediaPlayer::State state);
    // 上一曲
    void on_playUp_clicked();
    // 下一曲
    void on_playDown_clicked();
    // 播放模式设置
    void on_playMode_clicked();
    // QMediaPlaylist中playbackModeChanged信号对应槽函数
    void onPlaybackModeChanged(QMediaPlaylist::PlaybackMode mode);
    // 播放所有按钮发射信号和双击某首歌曲发射信号对应的槽函数
    void onPlayMusicByPageAndIndex(CommonPage* page, int index);

    // 添加最近播放列表
    // playlist中播放源发生改变的信号对应的槽函数，index表示正在播放的媒体索引
    void onCurrentIndexChanged(int index);

    // 音量控制
    // 设置是否静音
    void setPlayerMuted(bool isMuted);
    // 设置音量大小
    void setPlayerVolume(int volume);

    // 音乐时长控制
//    void onDurationChanged(qint64 duration);  // 歌曲总时长处理，不准确，弃用
    void onPositionChanged(qint64 position);  // 歌曲播放时长处理
    void onMusicSliderChanged(float ratio);  // 进度条改变时，歌曲进度也要发生变化
    void onMetaDataAvailableChanged(bool available);  // 元数据发生改变时


    void on_lrcPageBtn_clicked();

    void on_skin_clicked();

    void on_min_clicked();

    void on_max_clicked();

    bool eventFilter(QObject *watched, QEvent *event);

//protected:
//    void mousePressEvent(QMouseEvent *event);
//    void mouseMoveEvent(QMouseEvent *event);

    void on_addLike_clicked();
    void setAddLikeIcon(bool isLike);

private:
    Ui::MusicPlayer *ui;

    QPoint dragPosition;  // 保存鼠标与窗口左上角的相对位置

    QSqlDatabase sqlite;  // 数据库驱动

    VolumeTool* volumeTool;  // 音量调节弹窗

    LrcPage* lrcPage;  // 歌词界面
    QPropertyAnimation* lrcPageAnimationUp = nullptr;  // 歌词界面上移动画
    QPropertyAnimation* lrcPageAnimationDown = nullptr;  // 歌词界面下移动画
    bool lrcPageIsShow;

    MusicList musicList;  // 音乐列表，程序用来组织歌曲文件

    QMediaPlayer* player;  // 播放器，专门用来播放控制
    QMediaPlaylist* playlist;  // 播放列表，专门用来管理播放源，设置播放模式等
    CommonPage* currentPlayPage;  // 保存当前播放列表里的歌来自哪个页面
    CommonPage* prevPlayPage;  // 保存上一首播放的歌来自哪个页面
    int currentIndex;  // 当前播放歌曲在musicList中的索引
    qint64 totalTime = 0;  // 当前播放歌曲的总时长

    bool isMaximized = false;  // 是否最大化

    bool isDrag;  // 是否允许拖拽
};
#endif // MUSICPLAYER_H
